//
//  SHOAuthViewController.swift
//  三期微博1
//
//  Created by TownFish on 16/7/21.
//  Copyright © 2016年 TownFish. All rights reserved.
//

import UIKit
import SVProgressHUD
import AFNetworking

class SHOAuthViewController: UIViewController {
    
    override func loadView() {
        let urlString = "https://api.weibo.com/oauth2/authorize?client_id=\(APPKEY)&redirect_uri=\(APPREDIRECT_URI)"
        //初始化一个url
        let url = NSURL(string: urlString)
        guard let u = url else{
            return
        }
        //初始化一个request
        let request = NSURLRequest(URL: u)
        webView.loadRequest(request)
        webView.delegate = self
        
        view = webView
    }
    
    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
        progressView.removeView()
        
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()

        
    }
    
    //MARK: - 监听事件(取消和填充按钮)
    @objc private func cancelClick() {
        //关闭控制器
        dismissViewControllerAnimated(true, completion: nil)
    }
    @objc private func autoFillClick() {
        print("自动填充按钮")
        let jsString = "document.getElementById('userId').value='\(wbName)',document.getElementById('passwd').value='\(wbPasswd)'"
        //js注入
        webView.stringByEvaluatingJavaScriptFromString(jsString)
    }
    
    
    
    //MARK: - 设置视图
    private func setupUI() {
        //设置弹出窗口的颜色,让动画过度自然
        view.backgroundColor = UIColor.whiteColor()
        //实例化进度条
        navigationController?.view.insertSubview(progressView, aboveSubview: navigationController!.navigationBar)
        setupNav()
    }
    
    //MARK: - 设置导航
    private func setupNav() {
        navigationItem.leftBarButtonItem = UIBarButtonItem(title:"取消", imgName: nil, target: self, action: "cancelClick")
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "自动填充", imgName: nil, target: self, action: "autoFillClick")
        navigationItem.title = "微博登录"
    }
    
    //MARK: - 懒加载控件
    private lazy var webView: UIWebView = UIWebView()
    //webView进度条
    private lazy var progressView: SHOAuthProgressView = SHOAuthProgressView()
}

extension SHOAuthViewController:UIWebViewDelegate {
    //开始加载
    func webViewDidStartLoad(webView: UIWebView) {
//        SVProgressHUD.show()
        progressView.startAnim()
    }
    //加载完成
    func webViewDidFinishLoad(webView: UIWebView) {
//        SVProgressHUD.dismiss()
        progressView.endAnim()
    }
    //加载失败
    func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
        
    }
    /*
        监听webView 将要加载的request
            其有返回值:
                如果返回为true 代表继续加载
                如果返回为false 带包要停止加载
                默认如果不实现该方法 默认为true
    */
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        
        //请求的url字符串
        let urlString = request.URL?.absoluteString
//        print(urlString)
        //判断urlString 是否为nil
//        if let u = urlString {
//            print(u)
        if let u = urlString where u.hasPrefix(APPREDIRECT_URI) {
            //url的请求参数
            let query = request.URL?.query
            if let q = query {
                print(q)
                //获取code
                let code = q.substringFromIndex("code=".endIndex)
                print("终于等到你还好没放弃:\(code)")
                getUserAccount(code)
                
                SHUserAccountViewModel.sharedTools.loadUserAccount(code, isSuccess: { (isSucc) -> () in
                    print(isSucc)
                    if !isSucc {
                        print("请求失败")
                        return
                    }
//                    let result = SHUserAccountViewModel.sharedTools.userAccount
//                    print("用户数据:\(result)")
                    
                    //先关闭当前界面
                    self.dismissViewControllerAnimated(false, completion: { () -> Void in
                        //发送一个通知 告知appdelegat 切换根控制器
                        NSNotificationCenter.defaultCenter().postNotificationName(WBSwitchRootViewControllerNoti, object: nil)
                    })
                })
                return false
            }
        }
        
        return true
    }
}


//MARK: - 请求数据
extension SHOAuthViewController {
    func getUserAccount(code:String) {
        
        //第二次抽取替换
        SHNetworkTools.sharedTools.oauthLoadUserAccount(code, success: { (response) -> () in
            //判断response是否为nil 而且是否能转成字典
            guard let res = response as?[String: AnyObject] else {
                return
            }
            
            //字典转模型
            let userAccount = SHUserAccount(dict: res)
            //            print(userAccount)
            
            self.getUserInfo(userAccount)
            }) { (error) -> () in
                print("请求失败\(error)")
        }
        
        //下面的方法在第二次网络封装后被上面的方法替换
        
//        //请求urlString
//        let urlString = "https://api.weibo.com/oauth2/access_token"
//        //请求参数
//        let params = [
//        "client_id": APPKEY,
//        "client_secret": APPSECRET,
//        "grant_type": "authorization_code",
//        "code": code,
//        "redirect_uri": APPREDIRECT_URI
//        ]
//        //调用封装的方法
//        SHNetworkTools.shareTools.request(SHNetworkToolsType.POST, urlString: urlString, parameters: params, success: { (response) -> () in
//            //判断response是否为nil 而且是否能转成字典
//            guard let res = response as?[String: AnyObject] else {
//                return
//            }
//            
//            //字典转模型
//            let userAccount = SHUserAccount(dict: res)
//            //            print(userAccount)
//            
//            self.getUserInfo(userAccount)
//            }) { (error) -> () in
//                print("请求失败\(error)")
//        }
    }
    
        
//        下面的方法用上面网路封装的方法取代
//        
//        
//        //发送请求
//        let manager = AFHTTPSessionManager()
//        //指定反序列化器
//        manager.responseSerializer.acceptableContentTypes?.insert("text/plain")
//        //post请求
//        manager.POST(urlString, parameters: params, progress: nil, success: { (_, response) -> Void in
////            print("请求成功\(response)")
//            //当在guard或者if let中使用as 一般情况下,都是使用as?(试着转格式不确定转成功)
//            //判断response是否为nil 而且是否能转成字典
//            guard let res = response as?[String: AnyObject] else {
//                return
//            }
//            
//            //字典转模型
//            let userAccount = SHUserAccount(dict: res)
////            print(userAccount)
//            
//            self.getUserInfo(userAccount)
//            }) { (_, error) -> Void in
//                print("请求失败\(error)")
//        }
//        /*
//            client_id	true	string	申请应用时分配的AppKey。
//            client_secret	true	string	申请应用时分配的AppSecret。
//            grant_type	true	string	请求的类型，填写authorization_code
//            
//            grant_type为authorization_code时
//            必选	类型及范围	说明
//            code	true	string	调用authorize获得的code值。
//            redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。
//        */
//    }
    
   
        
        
    //获取用户信息数据
    func getUserInfo(userAccount: SHUserAccount) {
        
        SHNetworkTools.sharedTools.oauthLoadUserInfo(userAccount, success: { (response) -> () in
            //判断response是否为nil 而且是否可以转成字典
            guard let res = response as? [String: AnyObject] else{
                return
            }
            //因为当前screenname和avatar_large 本来就是可选值 所以在as的时候 只能as? 转字符串
            //给其userAccount身上两个为nil的属性赋值
            userAccount.screen_name = res["screen_name"] as? String
            userAccount.avatar_large = res["avatar_large"] as? String
            
            print(userAccount)
            }) { (error) -> () in
                print("请求失败:\(error)")
        }
        
        

        //下面的方法在第二次网络封装后被上面的方法替换
//        //请求的urlString
//        let urlString = "https://api.weibo.com/2/users/show.json"
//        //请求参数
//        let params = [
//            "access_token": userAccount.access_token!,
//            "uid": userAccount.uid!
//        ]
//        
//        SHNetworkTools.shareTools.request(SHNetworkToolsType.GET, urlString: urlString, parameters: params, success: { (response) -> () in
//            //判断response是否为nil 而且是否可以转成字典
//            guard let res = response as? [String: AnyObject] else{
//                return
//            }
//            //因为当前screenname和avatar_large 本来就是可选值 所以在as的时候 只能as? 转字符串
//            //给其userAccount身上两个为nil的属性赋值
//            userAccount.screen_name = res["screen_name"] as? String
//            userAccount.avatar_large = res["avatar_large"] as? String
//            
//            print(userAccount)
//            }) { (error) -> () in
//                print("请求失败:\(error)")
//        }
        
//        下面的方法被上面网络封装方法取代
//        
//        //发送请求
//        let manager = AFHTTPSessionManager()
//        //get请求
//        manager.GET(urlString, parameters: params, progress: nil, success: { (_, response) -> Void in
////            print("请求成功:\(response)")
//            //判断response是否为nil 而且是否可以转成字典
//            guard let res = response as? [String: AnyObject] else{
//                return
//            }
//            //因为当前screenname和avatar_large 本来就是可选值 所以在as的时候 只能as? 转字符串
//            //给其userAccount身上两个为nil的属性赋值
//            userAccount.screen_name = res["screen_name"] as? String
//            userAccount.avatar_large = res["avatar_large"] as? String
//            
//            print(userAccount)
//            
//            }) { (_, error) -> Void in
//                print("请求失败:\(error)")
//        }
    }

    /*
    access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
    uid	false	int64	需要查询的用户ID。
    screen_name	false	string	需要查询的用户昵称。

    */
}
